package daemonset

import (
	"context"
	"krm_pro/config"

	"github.com/gin-gonic/gin"
	appsv1 "k8s.io/api/apps/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

var daemSet = config.ClientSet.AppsV1().DaemonSets

type daemSetInfo struct {
	Name        string
	Namespace   string
	DaemSet     *appsv1.DaemonSet
	DaemSetList *appsv1.DaemonSetList
}

func DaemonSetList(r *gin.Context) {
	dmSet := daemSetInfo{}
	if err := r.ShouldBindJSON(&dmSet); err != nil {
		r.JSON(200, gin.H{
			"status":  400,
			"message": "struct bind flase",
		})
		return
	}
	d := dmSet.list()
	r.JSON(200, gin.H{
		"status":    200,
		"daemonSet": d,
	})
}

func DaemonSetGet(r *gin.Context) {
	dmSet := daemSetInfo{}
	if err := r.ShouldBindJSON(&dmSet); err != nil {
		r.JSON(200, gin.H{
			"status":  400,
			"message": "struct bind flase",
		})
		return
	}
	d := dmSet.get()
	r.JSON(200, gin.H{
		"status":    200,
		"daemonSet": d,
	})
}

func DaemonSetCreate(r *gin.Context) {
	dmSet := daemSetInfo{}
	if err := r.ShouldBindJSON(&dmSet); err != nil {
		r.JSON(200, gin.H{
			"status":  400,
			"message": "struct bind flase",
		})
		return
	}
	d := dmSet.create()
	r.JSON(200, gin.H{
		"status":    200,
		"daemonSet": d,
	})
}

func DaemonSetUpdate(r *gin.Context) {
	dmSet := daemSetInfo{}
	if err := r.ShouldBindJSON(&dmSet); err != nil {
		r.JSON(200, gin.H{
			"status":  400,
			"message": "struct bind flase",
		})
		return
	}
	d := dmSet.update()
	r.JSON(200, gin.H{
		"status":    200,
		"daemonSet": d,
	})
}

func DaemonSetDelete(r *gin.Context) {
	dmSet := daemSetInfo{}
	if err := r.ShouldBindJSON(&dmSet); err != nil {
		r.JSON(200, gin.H{
			"status":  400,
			"message": "struct bind flase",
		})
		return
	}
	dmSet.delete()
	r.JSON(200, gin.H{
		"status":  200,
		"message": "daemonset delete completed",
	})
}

func (d *daemSetInfo) list() *appsv1.DaemonSetList {
	daemset, err := daemSet(d.Namespace).List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		panic(err.Error())
	}
	return daemset
}

func (d *daemSetInfo) get() *appsv1.DaemonSet {
	daemset, err := daemSet(d.Namespace).Get(context.TODO(), d.Name, metav1.GetOptions{})
	if err != nil {
		panic(err.Error())
	}
	return daemset
}

func (d *daemSetInfo) create() *appsv1.DaemonSet {
	daemset, err := daemSet(d.Namespace).Create(context.TODO(), d.DaemSet, metav1.CreateOptions{})
	if err != nil {
		panic(err.Error())
	}
	return daemset
}

func (d *daemSetInfo) update() *appsv1.DaemonSet {
	daemset, err := daemSet(d.Namespace).Update(context.TODO(), d.DaemSet, metav1.UpdateOptions{})
	if err != nil {
		panic(err.Error())
	}
	return daemset
}

func (d *daemSetInfo) delete() {
	err := daemSet(d.Namespace).Delete(context.TODO(), d.Name, metav1.DeleteOptions{})
	if err != nil {
		panic(err.Error())
	}
}
